package com.tnovoselec.android.orm.apptools;

import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.j256.ormlite.support.ConnectionSource;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.widget.FrameLayout;

/**
 * Title: Android Framework - ORM <br />
 * Copyright: Copyright (c) 2011 <br />
 * 
 * Base class to use for fragment activities in Android.
 * 
 * You can simply call {@link #getHelper()} to get your helper class, or
 * {@link #getConnectionSource()} to get a {@link ConnectionSource}.
 * 
 * The method {@link #getHelper()} assumes you are using the default helper
 * factory -- see {@link OpenHelperManager}. If not, you'll need to provide your
 * own helper instances which will need to implement a reference counting
 * scheme. This method will only be called if you use the database, and only
 * called once for this activity's life-cycle. 'close' will also be called once
 * for each call to createInstance.
 * 
 * @author Tomislav Novoselec
 * @version 1.0.0
 * @since 1.0.0
 */

public class OrmLiteBaseFragmentActivity<H extends OrmLiteSqliteOpenHelper> extends SherlockFragmentActivity {
    private volatile H helper = null;
    private volatile boolean created = false;
    private volatile boolean destroyed = false;

    /**
     * Get a helper for this action.
     */
    public H getHelper() {
	if (helper == null) {
	    if (!created) {
		throw new IllegalStateException("A call has not been made to onCreate() yet so the helper is null!");
	    } else if (destroyed) {
		throw new IllegalStateException("A call to onDestroy has already been made and the helper cannot be used after that point!");
	    } else {
		throw new IllegalStateException("Helper is null for some unknown reason!");
	    }
	}

	return helper;
    }

    /**
     * Get a connection source for this action.
     */
    public ConnectionSource getConnectionSource() {
	return getHelper().getConnectionSource();
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
	if (helper == null) {
	    helper = getHelperInternal(this);
	    created = true;
	}

	super.onCreate(savedInstanceState);
    }

    @Override
    protected void onDestroy() {
	super.onDestroy();
	releaseHelper(helper);
	destroyed = true;
    }

    /**
     * This is called internally by the class to populate the helper object
     * instance. This should not be called directly by client code unless you
     * know what you are doing. Use {@link #getHelper()} to get a helper
     * instance. If you are managing your own helper creation, override this
     * method to supply this activity with a helper instance.
     * 
     * <p>
     * <b> NOTE: </b> If you override this method, you most likely will need to
     * override the {@link #releaseHelper(OrmLiteSqliteOpenHelper)} method as
     * well.
     * </p>
     */
    protected H getHelperInternal(Context context) {
	@SuppressWarnings("unchecked")
	H newHelper = (H) OpenHelperManager.getHelper(context);
	return newHelper;
    }

    /**
     * Release the helper instance created in
     * {@link #getHelperInternal(Context)}. You most likely will not need to
     * call this directly since {@link #onDestroy()} does it for you.
     * 
     * <p>
     * <b> NOTE: </b> If you override this method, you most likely will need to
     * override the {@link #getHelperInternal(Context)} method as well.
     * </p>
     */
    @SuppressWarnings("all")
    protected void releaseHelper(H helper) {
	OpenHelperManager.releaseHelper();
	helper = null;
    }
}
